package com.blog.mapper;

import com.blog.entity.Product;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 用于处理商品信息的Mapper。
 *
 * @author 黄嘉强
 */
@Mapper
public interface ProductMapper {

    /**
     * 获取前端系统首页要显示的所有商品信息
     * 基于@Select注解定义SQL查询语句，
     * 当sql语句中的字段名与要存储到的对象属性名不一致时，
     * 可以通过 @Result 注解定义映射规则。
     * @return 查询到的所有数据的List集合
     * @Result 当sql语句中的字段名与要存储的对象属性不一致，可以使用@Result注解来定义映射规则
     */
    @Select("select id,title,url,price,old_price,sale_count from product")
    @Result(column = "old_price",property = "oldPrice")
    @Result(column = "sale_count",property = "saleCount")
    List<Product> selectIndex();


    /**
     * 基于id查询商品的url
     * @param id 商品id
     * @return 查询到的url
     */
    @Select("select url from product where id = #{id}")
    String selectUrlById(int id);


    /**
     * 基于商品分类查询商品信息
     * @param cid 商品分类id
     * @return 查询到的商品信息的List集合
     */
    @Select("select id,title,url,price,old_price,sale_count from product where category_id=#{cid}")
    List<Product> selectByCategoryId(int cid);


    /**
     * 查询销量较好的商品
     * @return 销量较好的商品的List集合
     */
    @Select("select id,title,sale_count from product order by sale_count desc limit 0,6")
    @Result(column = "sale_count", property = "saleCount")
    List<Product> selectTop();


    /**
     * 在前端页面可以搜索具体商品
     * @param wd 商品名称
     * @return 商品信息集合
     * @Result
     *
     */
    @Select("select id,title,url,price,old_price,sale_count " +
            " from product where title like concat('%',#{wd},'%')")
    @Result(column = "old_price",property = "oldPrice")
    @Result(column = "sale_count",property = "saleCount")
    List<Product> selectByWd(String wd);


    // =========================================后端系统============================================================================

    /**
     * 查询后端系统中的商品信息。
     * @return 查询到的所有数据的List集合
     * @Result Result注解的作用是当属性名和表字段名不一致时进行的指定.
     */
    @Select("select id, title, url, price, view_count, sale_count, created from product")
    @Result(column = "sale_count", property = "saleCount")
    @Result(column = "view_count", property = "viewCount")
    List<Product> selectAdmin();

    /**
     * 像product表中插入数据，添加新的商品信息。
     * @param product 要添加的商品。
     */
    @Insert("insert into product values(null, #{title}, #{url}, #{price}, #{oldPrice}, " +
            "#{viewCount}, #{saleCount}, #{created}, #{categoryId})")
    void insert(Product product);


    /**
     * 基于id删除商品信息
     * @param id 商品id
     */
    @Delete("delete from product where id = #{id}")
    void deleteById(int id);


    /**
     * 更新商品浏览量
     * @param id 商品id
     */
    @Update("update product set view_count=view_count+1 where id=#{id}")
    void updateViewCount(int id);


    /**
     * 基于id查询商品信息
     * @param id 商品id
     * @return 查询到的商品信息
     * @Result
     */
    @Select("select id,title,url,price,old_price,sale_count,view_count from product where id=#{id}")
    @Result(column = "old_price",property = "oldPrice")
    @Result(column = "sale_count",property = "saleCount")
    @Result(column = "view_count",property = "viewCount")
    Product selectById(int id);



}
